java byte & 0xFF

您所在的位置:网站首页 java 字节数组赋值 java byte & 0xFF

java byte & 0xFF

2023-07-20 12:32| 来源: 网络整理| 查看: 265

一、JAVA 中的byte类型

byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。

在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。

负数补码 = 负数绝对值(正数) 符号位取反, 其余取反 +1

0000 0000 ~ 0111 1111 表示 0~127

1000 0000 比较特殊表示 -128, 因为0已经是有0000 0000 表示

1000 0001 ~ 1111 1111 表示 -127 ~ -1

e.g. 1000 0001 表示一个负数, 值补码为 000 0001 > 111 1110 (取反) > 111 1111 (+1) = 127 , 故 byte 1000 0001 表示 -127

同理 1111 1111 表示一个负数,值补码为 111 1111 > 000 0000(取反) > 000 0001 (+1) = 1, 故 byte 1111 1111 表示 -1

可以发现 byte 代表的最大值 +1 即变成了 最小值 :0111 1111 (127) + 1 = 1000 0000(-128)

二、byte & 0xFF 2.1 byte 与 int 的类型转换与截断

在 Java中 byte型数据在内存中占8位,int型数据在内存中占32位。0xff默认为int型,是十六进制。

0xFF: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 = 255

当 byte & 0xFF 时,先将byte 转 int : 正数 高补0 ,负数高补 1 (高位补符号位)。然后再截断成 byte (只取后8位)。

比如 :

byte i = 128; // 编译错 int a = (byte) 128 & 0xFF; log.info("{}", a); // -128

当定义byte i 为 128时, 编译错,根据上面的分析 byte 类型最大只支持到 127.

**128 :: 0000 0000 | 0000 0000 | 0000 0000| 1000 0000 **

0xFF :: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111

=> 0000 0000 | 0000 0000 | 0000 0000| 1000 0000 (与操作)

=> 1000 0000 byte类型截断,只取后面8位。(1000 0000 即代表的是 -128)

2.2 对于正数byte

对于 介于 0~127 的byte, 与上0xFF 即为其本来的值本身。

2.3 对于负数byte

byte = -1, 即 1111 1111。

byte = -1, 填充成int : 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111

0XFF: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111

​ 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 => 255

byte= -56, 即 11001000

byte = -56, 填充成int:1111 1111 | 1111 1111 | 1111 1111 | 11001000

0XFF: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111

​ 0000 0000 | 0000 0000 | 0000 0000 | 11001000 => 200

2.4 负数补码与补码对应正数的关系

比如负数-56补码:11001000 ,最高位1代表符号位。

现在把对应的11001000,认为是一个正数,即无符号位数, 则变成 200。

其实可以归纳总结出:

我们上面假设的数据x为有符号的数据,那么现在我们可以把x转换为无符号数据,计算原理如下

在这里插入图片描述

当8位时,w=8,即负数+256 => 无符号数

2.5 意义

byte & 0xFF : 将byte转化成一个0-255之间的数字,这个数字有可能不是原本的byte本身(因为负数的情况)。 但是将转成的int强制类型转换为 byte 就又回去。(恢复成了原来的byte的值)

@Slf4j public class test { @Test public void test01() { byte b = -128; int a = b & 0xff; log.info("byte {} converse to int(0~255): {}", b, a); log.info("int {} converse to byte: {}", a, (byte) a); } } 12:38:47.594 [main] INFO ch3.test - byte -128 converse to int(0~255): 128 12:38:47.597 [main] INFO ch3.test - int 128 converse to byte: -128


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3